#ifndef FPLAYER_DEVICEMANAGER_H
#define FPLAYER_DEVICEMANAGER_H

#include "Device.h"

#include <list>

/**
 * author: x-fan
 * date: 2024/1/18
 * desc: 采集设备管理
 */
class DeviceManager {
private:
  int32_t _IPCameraBase = 0;

  //音频设备
  AudioDevice *_pAudioDevice;

  //视频设备集
  std::list<IDevice *> _VideoDeviceList;

public:
  DeviceManager();

  virtual ~DeviceManager() noexcept;

  /**
   * 添加本地相机设备
   * @param devID 设备ID
   * @param deviceType 设备类型
   * @return 返回设备ID
   */
  int32_t addCameraDevice(int32_t devID, DeviceType deviceType);

  /**
   * 添加网络设备
   * @param streamUrl 网络流地址
   * @param isSoftDecode 解码模式
   * @param deviceType 设备类型
   * @return 返回设备ID
   */
  int32_t addIPCameraDevice(const char *streamUrl, bool isSoftDecode, DeviceType deviceType);

  /**
   * 删除采集设备
   * @param devID 设备ID
   */
  void deleteDevice(int32_t devID);

  /**
   * 清空所有设备
   */
  void clearDevice();

  /**
   * 修改本地相机的采集
   * @param width 预览宽
   * @param height 预览高
   * @param frameRate 帧率
   */
  void modifyCameraDevice(int32_t width, int32_t height);

  /**
   * 修改本地相机的参数
   * @param devID 设备ID
   * @param width 预览宽
   * @param height 预览高
   */
  void modifyCameraDevice(int32_t devID, int32_t width, int32_t height);

  /**
   * 修改音频参数
   * @param sampleRate 采样率
   * @param channelNum 采样通道数
   * @param samplesBitPer 采样点位数
   */
  void modifyAudioDevice(int32_t sampleRate, int32_t channelNum, int32_t samplesBitPer);

  /**
   * 查找视频设备
   * @param devID 设备ID
   * @return 视频设备
   */
  IDevice *findDeviceByID(int32_t devID);

  std::list<IDevice *> getDeviceList();

  /**
   * 获取音频设备
   * @return 音频设备
   */
  AudioDevice *getAudioDevice();

  /**
   * 返回本地相机的数量
   * @return 数量
   */
  int32_t getCameraDeviceNum();

};


#endif //FPLAYER_DEVICEMANAGER_H
